package com.yuchuang.controller;

import com.yuchuang.base.Enum;
import com.yuchuang.base.PageInfo;
import com.yuchuang.base.Result;
import com.yuchuang.model.User;
import com.yuchuang.model.vo.UserVo;
import com.yuchuang.redis.RedisCache;
import com.yuchuang.service.UserService;
import com.yuchuang.utils.JWTUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.HttpServletRequest;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.List;
import java.util.Map;

/**
 *@authoe    :cy
 *@date      :13:50 2023-04-25
 *description:  用户信息相关接口
 * @RestController注解相当于@ResponseBody和@Controller的结合
 * @RestController为开发提供了方便☺，在提供json接口时需要的配置操作再也不需要自己配置了。
 *
 * @ResponseBody
 * 在实际操作中我们只需要在Controller层使用@RequestBody注解就可以将对象进行反序列化；而若需要对Controller的方法进行序列化，
 * 我们需要在返回值上使用@ResponseBody；也可以将@ResponseBody注解在Controller类上，这样可以将这个类中所有的方法序列化。
 *
 * @Controller
 * @Controller是一种特殊化的@Component类，在实际操作中@Controller用来表示Spring某个类是否可以接受HTTP请求，她通常与@ResponseBody绑定使用。
 *
 * @Component
 * 1.把普通POJO（Plain Ordinary Java Object简单的java对象）实例化到spring容器中，相当于配置文件中的<bean id="" class=""/>
 * 2.泛指组件，当组件不好归类的时候，可以使用@Component注解进行标注
 *
 * @autowored
 * 将@autowored写在被注入的成员变量上，就不用再xml文件中配置了，在程序中去掉相应的setter和getter方法，
 *return     :
 **/
@RestController
@RequestMapping("/user")
@Api(tags="用户信息")
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private RedisCache redisCache;
    @PostMapping("/login")
    @ApiOperation("登录接口")
    @ApiImplicitParams({
            @ApiImplicitParam(value="" +
                    "{\n" +
                        "\"userNickname\":\"null\",// 必填 varchar  昵称 \n" +
                        "\"userPwd\":\"null\", //必填 varchar   用户密码 \n" +
                    "}",name = "Map",required = true,paramType = "body"),
    })
    public Result login( @ApiIgnore @RequestBody  Map<String,Object> params){
        try{
            User user = userService.getUser(params);
            if(user == null){
                return Result.fail("用户名或密码错误");
            }
            String token = JWTUtil.createToken(user);
            try{
                redisCache.setCacheObject("token_"+user.getUserNickname(),token);
            }catch(Exception e1){
                System.out.print("catchRedis错误:--------------"+e1);
                return Result.fail(Enum.ErrorNoStartRedis);
            }
            return Result.ok("登录成功",token);
        }catch(Exception e){
            System.out.print("catch错误:--------------"+e);
            return Result.fail("登录失败");
        }
    }

    @GetMapping("all")
    @ApiOperation("查询所有")
    @ApiImplicitParams({
            @ApiImplicitParam(value="{\n" +
                    "    \"userNickname\":1,  //可选  varchar  模糊查询所有 \n" +
                    "}",name = "Map",required = true,paramType = "body"),
    })
    public Result all(HttpServletRequest request){
//    public Result all(@ApiIgnore UserVo userVo){
        try{
            List list = userService.queryAll(request);
            return Result.ok(list);
        }catch(Exception e){
            return Result.fail("查询失败"+e);
        }
    }
    //Mybatisplus  分页查询
    @PostMapping("/selectAll")
    @ApiOperation("MybatisPlus 分页查询")
    @ApiImplicitParams({
            @ApiImplicitParam(value="{\n" +
                    "    \"pageNum\":1,\n" +
                    "    \"pageSize\":\"10\"\n" +
                    "    \"userNickname\":1,  //可选  varchar  模糊查询所有 \n" +
                    "}",name = "Map",required = true,paramType = "body"),
    })
    public Result selectAll(
            @ApiIgnore @RequestBody UserVo userVo
            ){
        PageInfo pageInfo = userService.selectPageVo(userVo);
        return Result.ok("查询成功",pageInfo);
    }
    @PostMapping("/insert")
    @ApiOperation("新增")
    @ApiImplicitParams({
            @ApiImplicitParam(value= "{\n" +
                    "\"userNickname\":\"null\",// 必填 varchar  用户昵称 \n" +
                    "\"userPwd\":\"null\", //必填 varchar   用户密码 \n" +
                    "\"userVipGrade\":\"null\",//可选  int 会员等级  0不是会员   默认0   1 会员 \n" +
                    "\"userHead\":\"null\", //可选  varchar  用户头像 \n" +
                    "\"userName\":\"null\", //可选  varchar  真实姓名 \n" +
                    "\"telephone\":\"null\"//可选   varchar  用户电话 \n" +
                    "}",name = "Map",required = true,paramType = "body"),
    })
    public Result insert(
            @ApiIgnore  @RequestBody User user
    ){
        try{
            int val = userService.insert(user);
            return Result.ok("添加成功",val);
        }catch(Exception e){
            Throwable cause = e.getCause();
            String errMsg = "";
            if(cause instanceof SQLIntegrityConstraintViolationException){
                //错误信息
                errMsg = ((SQLIntegrityConstraintViolationException) cause).getMessage();
                //根据约束名称定位具体字段
                if(StringUtils.isNotBlank(errMsg) && errMsg.indexOf("userNickName_unique") != -1){
                    return Result.fail("重复添加失败");
                }else{
                    return Result.fail("添加失败"+errMsg);
                }
            }else{
                return Result.fail("添加失败"+e);
            }
        }
    }
    @PostMapping("/update")
    @ApiOperation("修改")
    @ApiImplicitParams({
            @ApiImplicitParam(value="{\n" +
                    "\"id\":\"1\"\n" +
                    "\"userNickname\":\"null\",// 必填 varchar  用户昵称 \n" +
                    "\"userPwd\":\"null\", //必填 varchar   用户密码 \n" +
                    "\"userVipGrade\":\"null\",//可选  int 会员等级  0不是会员   默认0   1 会员 \n" +
                    "\"userHead\":\"null\", //可选  varchar  用户头像 \n" +
                    "\"userName\":\"null\", //可选  varchar  真实姓名 \n" +
                    "\"telephone\":\"null\"//可选   varchar  用户电话 \n" +
                    "}",name = "Map",required = true,paramType = "body"),
    })
    public Result update(
            @ApiIgnore  @RequestBody Map<String,Object> params
    ){
        try{
            int val = userService.update(params);
            return Result.ok("修改成功",val);
        }catch (Exception e){
            Throwable cause = e.getCause();
            String errMsg = "";
            if(cause instanceof SQLIntegrityConstraintViolationException){
                //错误信息
                errMsg = ((SQLIntegrityConstraintViolationException) cause).getMessage();
                //根据约束名称定位具体字段
                if(StringUtils.isNotBlank(errMsg) && errMsg.indexOf("userNickName_unique") != -1){
                    return Result.fail("重复数据！修改失败");
                }else{
                    return Result.fail("修改失败"+errMsg);
                }
            }else{
                return Result.fail("修改失败"+e);
            }
        }
    }
    @PostMapping("/delete")
    @ApiOperation("删除操作")
    @ApiImplicitParams({
            @ApiImplicitParam(value="{\n" +
                    "    \"id\":\"1\"\n" +
                    "}",name = "Map",required = true,paramType = "body"),
    })
    public Result delete(
            @ApiIgnore  @RequestBody Map<String,Object> params
    ){
        try{
            int val = userService.delete(params);
            return Result.ok("删除成功",val);
        }catch(Exception e){
            return Result.fail("删除失败"+e);
        }
    }
}
